package org.KeyCrafter.ds.list;


public interface List {

    // 定义常量：
    // 迭代器迭代方向
    // 从表头向表尾迭代
    int AL_START_HEAD = 0;

    // 从表尾向表头迭代
    int AL_START_TAIL = 1;

    interface Node {
        Object getValue();
        void SetValue(Object value);
        Node getPrev();
        Node getNext();
    }

    // 返回链表长度
    long length();

    // 返回头节点
    Node first();

    // 返回尾节点
    Node last();

    // 返回给定节点的前置节点
    Node prevNode(Node n);

    // 返回给定节点的后置节点
    Node nextNode(Node n);

    // 将一个包含给定值的新节点添加到给定链表的表头
    List addNodeHead(Object value);

    // 将一个包含给定值的新节点添加到给定链表的表尾
    List addNodeTail(Object value);

    // 将一个包含给定值的新节点添加到给定节点的之前或者之后
    List insertNode(Node oldNode, Object value, boolean after);

    // 查找并返回链表中包含给定值的节点
    Node searchKey(Object key);

    // 返回链表在给定索引上的节点
    Node index(long index);

    // 将链表的表尾节点弹出,然后将被弹出的节点插人到链表的表头,成为新的表头节点
    void rotate();

    void delNode(Node node);

    // 复制一个链表的副本
    List dup();

    // 释放链表，以及链表中的所有节点
    void release();

    // 将给定的函数设置为链表的节点值复制函数
    void setDupMethod(Dup dup);

    // 返回链表当前正在使用的节点值复制函数
    Dup getDupMethod();

    // 将给定的函数设置为链表的节点值释放函数
    void setFreeMethod(Free free);

    // 返回链表当前正在使用的节点值释放函数
    Free getFreeMethod();

    // 将给定的函数设置为链表的节点值对比函数
    void setMatchMethod(Match match);

    // 返回链表当前正在使用的节点值复制函数
    Match getMatchMethod();

    //  默认返回从头到尾的迭代器
    ListIter getIterator();

    ListIter getIterator(int direction);
}
